package soccerBet.project.main;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.concurrent.Semaphore;

import soccerBet.project.Parser.ScreenScraping;
import soccerBet.project.agenda.RemindTask;
import soccerBet.project.agenda.Reminder;
import soccerBet.project.dao.InfoPrecosDAO;
import soccerBet.project.funds.Funds;
import soccerBet.project.mail.SendMailTLS;
import soccerBet.project.objects.InfoPrecos;
import soccerBet.project.objects.Jogo;
import soccerBet.project.services.EmailService;
import soccerBet.project.services.HistoricoApostasService;
import soccerBet.project.services.JogoService;
import soccerBet.project.services.XLSService;
import soccerBet.project.utils.Display;
import soccerBet.project.utils.Utils;

public class SoccerBet {
	
	public SoccerBet (){
		
	}

	
	public void beginSoccerBet() {
		
		
		Display.println("A analisar ligas e jogos existentes em bd...\n");
		new ScreenScraping().getStatistics();
		
		Semaphore semaphore = new Semaphore(1);
		
		JogoService jogoService = new JogoService();
		
		new ScreenScraping().updateDatesOfGames();
		
		Display.println("A obter jogos a decorrer...",true);
		List<Jogo> jogos = jogoService.getRecentGames();
		
		informaHistoricoApostas();
		
		informaJogosExistentes(jogos);
		
		if(jogos.size()>0){
			long tempoIni =  Utils.verificaJogoDecorrer(jogos.get(0)); 
			Timer timer = new Timer();
			timer.schedule(new Funds(jogos.get(jogos.size()-1).getData().getTime()), tempoIni <= 0 ? 0 : (tempoIni - (10*60*60)));
		}else
			Display.println("Sem jogos para agendar...",true);

		
		for(Jogo jogo : jogos){
			
			long tempoRestante =  Utils.verificaJogoDecorrer(jogo); 
			
			if(tempoRestante>=0){
				new Reminder(jogo,tempoRestante,semaphore);
			}
		}

		
	}


	private void informaHistoricoApostas() {
		
		InfoPrecosDAO infoPrecosDAO = new InfoPrecosDAO();
		HistoricoApostasService histService = new HistoricoApostasService();
		XLSService xlsService = new XLSService();
		
		List<InfoPrecos>  history =  infoPrecosDAO.getInfoPrecoByDate();
		 
		
		if(history.size()>0){
			
			EmailService emailService = new EmailService();
							
			String SIDEmail = Utils.convertDateToId(new Date());
			
			if(emailService.EmailAlreadySended(SIDEmail+"_HIST")==false){
				xlsService.geraXls(histService.obtemHistorico(history),SIDEmail+"_HIST");
				emailService.sendEmailHistory(SIDEmail+"_HIST");
			}
		}
		
	}


	private void informaJogosExistentes(List<Jogo> jogos) {
		// TODO Auto-generated method stub
		JogoService jogoService = new JogoService();
		String dia="";

		List<Jogo> jogosNotBet = jogoService.getRecentGamesNotBet();

		if(jogos.size()>0 || jogosNotBet.size()>0){
			
			EmailService emailService = new EmailService();
			
			if(jogos.size()>0){
				dia= jogos.get(0).getDate();
			}else
				if(jogosNotBet.size()>0){
					dia= jogosNotBet.get(0).getDate();
				}
				
			String SIDEmail = Utils.convertDateToId(new Date());
			
			if(emailService.EmailAlreadySended(SIDEmail)==false){
				emailService.sendEmailOfGames(SIDEmail,dia,jogos,jogosNotBet);
			}
		}
	}

}
